package ningbo.oop;

/**
 * @Author 宁铂
 * @Date 2021/7/12 11:20
 * @Version 1.0
 */
public class TestDemo {
    /** 本类用于测试多态的入门案例 */
    public static void main(String[] args) {

        Animal.play();

        Cat cat = new Cat();
        Dog dog = new Dog();

        cat.eat();
        dog.eat();

        Animal animal = new Animal();

        animal.eat();

        /** 创建多态对象
         *  口诀1: 父类引用 指向 子类对象;
         *  口诀2: 编译(定义)看左边,运行看右边
         * */
        Animal animal1 = new Cat();
        Animal animal2 = new Dog();

        /** 多态中,方法定义使用的是父类,方法实现使用的是子类的 */
        animal1.eat();
        animal2.eat();
        /** 多态中成员变量使用的是父类的成员变量 */
        System.out.println(animal1.sum);

        /** duo多态中,静态方法都是自己的,因为静态就不存在重写的概念(静态的执行优先于对象的创建) */
        animal2.play();
    }
}

/** 多态的前提:继承 + 重写
 *  多态不能调用,子类的特有功能
 *
 *  多态是为了统一标准, 向父类看齐
 *  父类中定义的功能才能用,子类的特有功能用不了
 * */
class Animal{
    int sum = 10;

    public void eat() {
        System.out.println("小动物吃啥都行~~~");
    }

    public static void play(){
        System.out.println("小动物玩啥都行~~~");
    }
}

class Cat extends Animal{

    int sum = 100;

    @Override
    public void eat() {
        System.out.println("小猫爱吃小鱼干~~~");
    }
}

class Dog extends Animal{
    @Override // 测试重写是否成功
    public void eat() {
        System.out.println("小狗爱吃肉骨头~~~");
    }

    public static void play(){
        System.out.println("小狗爱打滚~~~");
    }
}